﻿using System;
using System.Collections.Generic;
using System.Text;

namespace HelloOne.Store
{
    public interface IRepository<T>
        where T : class, IEntity
    {
        T Find(Guid id);

        IList<T> All();

        /// <summary>
        /// 只返回一个结果或null
        /// </summary>
        /// <param name="func"></param>
        /// <returns></returns>
        T FindSingle(Func<T, bool> func);

        /// <summary>
        /// 返回一个集合
        /// </summary>
        /// <param name="func"></param>
        /// <returns></returns>
        IList<T> FindMultiple(Func<T, bool> func);

        /// <summary>
        /// 只返回一个结果或null，并保证使用了最快的查询方式，不保证可以使用复杂属性查询
        /// </summary>
        /// <param name="func"></param>
        /// <returns></returns>
        T FindSingleFast(Func<T, bool> func);

        /// <summary>
        /// 返回一个集合，并保证使用了最快的查询方式，不保证可以使用复杂属性查询
        /// </summary>
        /// <param name="func"></param>
        /// <returns></returns>
        IList<T> FindMultipleFast(Func<T, bool> func);

        void Save(T entity);
    }
}